15.3 文件 IO 操作

Kotlin为java.io.File提供了大量好用的扩展函数,这些扩展函数主要在下面三个源文件中:

  • kotlin/io/files/FileTreeWalk.kt
  • kotlin/io/files/Utils.kt
  • kotlin/io/FileReadWrite.kt

同时,Kotlin 也针对InputStream、OutputStream和 Reader 等都做了简单的扩展。它们主要在下面的两个源文件中:

  • kotlin/io/IOStreams.kt
  • kotlin/io/ReadWrite.kt

Koltin 的序列化直接采用的 Java 的序列化类的类型别名:

  1. internal typealias Serializable = java.io.Serializable

下面我们来简单介绍一下 Kotlin 文件读写操作。

15.3.1 读文件

读取文件全部内容

我们如果简单读取一个文件,可以使用readText()方法,它直接返回整个文件内容。代码示例如下

  1. /**
  2. * 获取文件全部内容字符串
  3. * @param filename
  4. */
  5. fun getFileContent(filename: String): String {
  6. val f = File(filename)
  7. return f.readText(Charset.forName("UTF-8"))
  8. }

我们直接使用 File 对象来调用 readText 函数即可获得该文件的全部内容,它返回一个字符串。如果指定字符编码,可以通过传入参数Charset来指定,默认是UTF-8编码。

如果我们想要获得文件每行的内容,可以简单通过split("\n")来获得一个每行内容的数组。

获取文件每行的内容

我们也可以直接调用 Kotlin 封装好的readLines函数,获得文件每行的内容。readLines函数返回一个持有每行内容的 List。

  1. /**
  2. * 获取文件每一行内容,存入一个 List 中
  3. * @param filename
  4. */
  5. fun getFileLines(filename: String): List<String> {
  6. return File(filename).readLines(Charset.forName("UTF-8"))
  7. }

直接操作字节数组

我们如果希望直接操作文件的字节数组,可以使用readBytes()。如果想使用传统的Java方式,在Kotlin 中你也可以像 Groovy 一样自如使用。

  1. //读取为bytes数组
  2. val bytes: ByteArray = f.readBytes()
  3. println(bytes.joinToString(separator = " "))
  4. //直接像 Java 中的那样处理Reader或InputStream
  5. val reader: Reader = f.reader()
  6. val inputStream: InputStream = f.inputStream()
  7. val bufferedReader: BufferedReader = f.bufferedReader()

15.3.2 写文件

和读文件类似,写入文件也很简单。我们可以写入字符串,也可以写入字节流。还可以直接使用Java的 Writer 或者 OutputStream。

覆盖写文件

  1. fun writeFile(text: String, destFile: String) {
  2. val f = File(destFile)
  3. if (!f.exists()) {
  4. f.createNewFile()
  5. }
  6. f.writeText(text, Charset.defaultCharset())
  7. }

末尾追加写文件

  1. fun appendFile(text: String, destFile: String) {
  2. val f = File(destFile)
  3. if (!f.exists()) {
  4. f.createNewFile()
  5. }
  6. f.appendText(text, Charset.defaultCharset())
  7. }